package com.smart4j.chapter.common.pool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Vector;

import com.smart4j.chapter.common.util.Global;


/**
 * description: new java files...TODO
 * @version v1.0
 * @author w
 * @date 2018年8月5日下午2:22:30
 *
 */

public class ConnectUtils {
	

	private static Vector<Connection> pools ; 
	private static Integer poolSize ;
	/**
	 * 默认初始加载的连接个数
	 */
	private static final Integer DEFAULT_POOL_SIZE=10 ;
	
	private static ConnectUtils instance ;

	private static String DRIVER ;
	private static String URL ;
	private static String USER ;
	private static String PWD ;
	
	/**
	 * 构造方法私有化，避免外部 直接new 获取当前对象实例。
	 */
	private ConnectUtils() {
		loadPropery();
		init();
	}
	
	private void loadPropery() {
		DRIVER=Global.getInstanse().getConfig("jdbc.driver");
		URL=Global.getInstanse().getConfig("jdbc.url");
		USER=Global.getInstanse().getConfig("jdbc.username");
		PWD=Global.getInstanse().getConfig("jdbc.password");
		Integer size = Global.getInstanse().getInteger("jdbc.poolSize");
		poolSize = size != null ? size : DEFAULT_POOL_SIZE;
	}

	/**
	 * 获取当前类石例  --- 单例 懒汉式
	 * @return
	 */
	public synchronized static ConnectUtils getInstance(){
		if(null == instance){
			instance = new ConnectUtils();
		}
		return instance;
	}
	
	/**
	 * 初始化连接池
	 */
	private  void init(){
		try {
			// 增加驱动加载，否则在 web环境下会抛出异常：  No suitable driver found for jdbc: xx 
			// 即使jdk1.7 环境下也无效
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
		pools=new Vector<>(poolSize);
		for (int i = 0; i < poolSize; i++) {
			Connection c = null;
			try {
				c = DriverManager.getConnection(URL,USER,PWD);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			pools.add(c);
		}
	} 
	
	/**
	 * 获取一个连接对象
	 * synchronized : 避免多线程环境下，同一个连接被获取多次
	 * 该链接对象会自动提交事务： autoCommit = true
	 * @return
	 */
	public synchronized Connection getConnection(){
		if(pools.size() > 0){
			return pools.remove(0);
		}
		return null ;
	}
	
	/**
	 * description: 获取连接对象 Connection
	 * @param isAutoCommit 是否自动提交事务 , true : 自动提交 ; false 需手动提交事务
	 * @return
	 * Connection 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月10日 上午11:23:54
	 *
	 */
	public synchronized Connection getConnection(boolean isAutoCommit){
		if(isAutoCommit){
			return getConnection();
		}else{
			if(pools.size() > 0 ){
				Connection connection = pools.get(0);
				try {
					connection.setAutoCommit(false);
				} catch (SQLException e) {
					e.printStackTrace();
				}
				pools.remove(connection);
				return connection;
			}
		}
		return null ;
	}
	
	/**
	 * 释放链接资源
	 * @param conn
	 */
	public void release(Connection conn){
		if(conn != null){
			pools.add(conn);
		}
	}
	
	/**
	 * 获取连接池剩余的连接数
	 * @return
	 */
	public static int getPoolsSize(){
		if(!pools.isEmpty()){
			return pools.size();
		}
		return 0;
	}
	
	/**
	 * 直接获取连接，不使用连接池
	 * @param i 站位 ，实现重载
	 * @return
	 */
	public static Connection getConnection(int i){
		try {
			Connection connection = DriverManager.getConnection(URL,USER,PWD);
			return connection;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null ;
	}
	
	/**
	 * description: 销毁连接池 
	 * void 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月7日 下午3:55:03
	 *
	 */
	public void destroy(){
		if(!pools.isEmpty()){
			Iterator<Connection> iterator = pools.iterator();
			while(iterator.hasNext()){
				Connection connection = iterator.next();
				try {
					// 关闭 连接
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				// 从连接池中移除
				pools.remove(connection);
			}
		}
	}
}




